home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / NP2v120.asm < prev    next >
Encoding:
Assembly Source File  |  1992-09-23  |  11.3 KB  |  596 lines

  1. **
  2. **    Noisepacker 2.x playroutine for DeliTracker 1.21+
  3. **    Made for DT by Kevin Dackiw
  4. **    Use Macro 68 for assembly
  5. **
  6. **    If you have any comments or make any changes to the code,
  7. **    please contact me!
  8. **
  9. **    EMail:    kevind@ersys.edmonton.ab.ca
  10. **        sikorsky@bode.ee.ualberta.ca
  11. **
  12. **    to do:    add <<,>> support
  13. **        fix songend detection logic
  14. **
  15. **    bugs: none that I know of
  16. **
  17. **    History:
  18. **
  19. **    v1.00    Initial release.
  20. **    v1.10    Added support for songend detection.
  21. **        Streamlined the interface.
  22. **        Note that it DOESN'T look for NPAK0002 headers now!
  23. **    v1.20    Fixed up check routine.
  24. **        Removed player's ability to change filter.
  25. **        Optimized volume/balance code.
  26. **        * Thanks to Peter for suggestions!...8-) *
  27. **
  28.     section NP2_player,code
  29.  
  30.     newsyntax
  31. *    strict
  32. *    debug
  33. *    addsym
  34.     objfile    'ram:npacker2'
  35.     errfile    'ram:errorfile'
  36.     normobj
  37. *    smallobj
  38.     exeobj
  39.     incdir    'includes:'
  40.     include    'misc/deliplayer.i'
  41.  
  42. start    PLAYERHEADER functions
  43.  
  44. version    dc.b    '$VER: NoisePacker_2 player module v1.20 '
  45.     doscmd    'libdate >t:d1'
  46.     incbin    't:d1'
  47.     dc.b    $D,0
  48.  
  49.     dc.b    'Assembled: '
  50.     doscmd    'date >t:d2'
  51.     incbin    't:d2'
  52.     dc.b    $D,0
  53.  
  54.     cnop    0,4    ;next long for 68030 speed   8-)
  55.  
  56. functions    dc.l    DTP_PlayerVersion,3
  57.     dc.l    DTP_PlayerName,playername
  58.     dc.l    DTP_Creator,creator
  59.     dc.l    DTP_Check2,checkmod
  60.     dc.l    DTP_Interrupt,interrupt
  61.     dc.l    DTP_InitPlayer,initplayer
  62.     dc.l    DTP_EndPlayer,endplayer
  63.     dc.l    DTP_InitSound,initsound
  64.     dc.l    DTP_EndSound,endsound
  65.     dc.l    DTP_Volume,volume
  66.     dc.l    DTP_Balance,balance
  67.     dc.l    TAG_DONE
  68.  
  69. playername    dc.b    'NoisePacker_2.x',0
  70. creator    dc.b    'Original code by Phenomena;',$A
  71.     dc.b    'Adapted by Kevin Dackiw',0
  72.  
  73.     cnop    0,4
  74.  
  75. checkmod    movea.l    (dtg_ChkData,a5),a0    ;mod start
  76.     moveq    #-1,d0            ;fail level
  77.     moveq    #0,d1            ;clear d1 for cleanliness
  78.     movea.l    a0,a1            ;save start for below
  79.     move.w    (a0),d1            ;check word 0
  80.     andi.w    #$0f,d1            ;for divisibility
  81.     cmpi.w    #$0c,d1            ;by $C
  82.     bne    4$                ;not np
  83.  
  84.     adda.w    (a0)+,a1            ;maybe np...
  85.     move.w    (-4,a1),d2        ;check 2 identical bytes...
  86.     cmp.w    (a0)+,d2            ;...the only 2...!
  87.     bne    4$                ;nope
  88.  
  89.     adda.w    d2,a1            ;ok...
  90.     move.w    (a0)+,d1            ;fetch next offset...
  91.     lsr.w    #1,d1            ;...and fix it
  92.     subq.w    #1,d1            ;...somemore
  93. 2$    moveq    #0,d2
  94.     move.w    (a1)+,d2            ;look into pattern offset table
  95.     divu.w    #$c0,d2            ;multiple of $C0?
  96.     clr.w    d2                ;...hmmm...
  97.     swap    d2                ;...well?
  98.     bne    4$                ;no...fail
  99.     dbra    d1,2$            ;yes!  Check the whole table!
  100.  
  101.     subq.w    #6,a0            ;back to module start again...
  102.     moveq    #0,d2            ;...
  103.     move.l    d2,a1            ;...to check mod length!
  104.     add.w    (a0)+,a1            ;add length of inst table
  105.     move.l    a1,d1            ;save for counter
  106.     subi.w    #$0c,d1            ;fix
  107.     lsr.l    #4,d1            ;fix
  108.     subq.w    #1,d1            ;-> # of instrument entries
  109.     moveq    #3-1,d3            ;3 words to add
  110. 5$    move.w    (a0)+,d2            ;add in position table length
  111.     add.l    d2,a1            ;and offset and pattern table
  112.     dbf    d3,5$            ;lengths
  113.     addq.w    #4,a0            ;jump to first inst length
  114. 3$    moveq    #0,d2            ;clear
  115.     move.w    (a0),d2            ;fetch inst length
  116.     add.l    d2,d2            ;...add length
  117.     add.l    d2,a1            ;...and add to sum to get bytes
  118.     addi.w    #$10,a0            ;skip to next
  119.     dbra    d1,3$            ;do all instruments
  120.  
  121.     move.l    (dtg_ChkSize,a5),d1    ;size of loaded module from DT
  122.     move.l    d1,d2            ;save
  123.     sub.l    #1024,d1            ;-1k ... adjust if necessary
  124.     add.l    #1024,d2            ;+1k ... adjust if necessary
  125.     cmp.l    d1,a1            ;check it
  126.     blt    4$                ;too small!
  127.     cmp.l    d2,a1            ;check it
  128.     bgt    4$                ;too big!
  129.     moveq    #0,d0            ;just right.  8-)
  130. 4$    rts
  131.  
  132. interrupt    movem.l    d0-d7/a0-a6,-(sp)    ;save all since an
  133.     bsr    np_music
  134.     movem.l    (sp)+,d0-d7/a0-a6    ;interrupt calls this
  135.     rts
  136.  
  137. initplayer    moveq    #0,d0            ;first file wanted
  138.     movea.l    (dtg_GetListData,a5),a0
  139.     jsr    (a0)                ;get module address        
  140.     move.l    a0,(np_data)        ;save
  141.     move.w    (2,a0),(patterns)    ;# of patterns in song
  142.     move.l    a5,(DTbase)        ;save for later toying
  143.     movea.l    (dtg_AudioAlloc,a5),a0
  144.     jsr    (a0)
  145.     rts
  146.  
  147. endplayer    movea.l    (dtg_AudioFree,a5),a0
  148.     jsr    (a0)
  149.     rts
  150.  
  151. initsound    bsr    np_init
  152.     rts
  153.  
  154. endsound    movea.l    (np_data),a0
  155.     move.w    (2,a0),(patterns)    ;restore pattern counter
  156.     bsr    np_end
  157.     rts
  158.  
  159. balance    nop
  160.  
  161. volume    move.w    (dtg_SndVol,a5),(mv)
  162.     move.w    (dtg_SndLBal,a5),(lv)
  163.     move.w    (dtg_SndRBal,a5),(rv)
  164.     rts
  165.  
  166.     cnop    0,4
  167.  
  168. np_data    dc.l    0
  169. DTbase    dc.l    0
  170. patterns    dc.w    0
  171. currentvol    dc.w    0
  172. mv    dc.w    0
  173. lv    dc.w    0
  174. rv    dc.w    0
  175.  
  176.     cnop    0,4
  177.  
  178. np_init    movea.l    (np_data),a4
  179.     lea    ($dff000),a5
  180.     lea    (np_position,pc),a6
  181.     moveq    #2,d0
  182.     moveq    #0,d1
  183.     movea.l    a4,a3
  184. np_init1    adda.w    (a4)+,a3
  185.     move.l    a3,(a6)+
  186.     dbra    d0,np_init1
  187.     move.w    (a4)+,d0
  188.     adda.l    d0,a3
  189.     move.l    #0,(a6)+
  190.     move.l    #$01060100,(a6)+
  191.     move.w    #$8200,(a6)+
  192.     move.l    d1,(a6)+
  193.     move.l    #np_portup,(a6)+
  194.     move.l    #np_portdown,(a6)+
  195.     move.l    #np_port,(a6)+
  196.     move.l    #np_vib,(a6)+
  197.     move.l    #np_port2,(a6)+
  198.     move.l    #np_vib2,(a6)+
  199.     move.l    #np_volslide,(a6)+
  200.     move.l    #np_arp,(a6)+
  201.     move.l    #np_songjmp,(a6)+
  202.     move.l    #np_setvol,(a6)+
  203.     move.l    #np_pattbreak,(a6)+
  204.     move.l    #np_filter,(a6)+
  205.     move.l    #np_setspeed,(a6)+
  206.     moveq    #0,d0
  207.     movea.l    a4,a6
  208.     adda.w    (-8,a4),a6
  209.     suba.w    #12,a6
  210. np_init2    move.l    a3,(a4)
  211.     movea.l    a3,a2
  212.     move.w    (14,a4),d0
  213.     add.w    d0,d0
  214.     adda.l    d0,a2
  215.     move.l    a2,(8,a4)
  216.     move.w    (4,a4),d0
  217.     add.w    d0,d0
  218.     adda.l    d0,a3
  219.     adda.w    #16,a4
  220.     cmpa.l    a4,a6
  221.     bne.b    np_init2
  222.     move.w    d1,($a8,a5)
  223.     move.w    d1,($b8,a5)
  224.     move.w    d1,($c8,a5)
  225.     move.w    d1,($d8,a5)
  226.     move.w    #$f,($96,a5)
  227.     rts
  228.  
  229. np_end    lea    ($dff000),a5
  230.     clr.w    ($a8,a5)
  231.     clr.w    ($b8,a5)
  232.     clr.w    ($c8,a5)
  233.     clr.w    ($d8,a5)
  234.     move.w    #$f,($96,a5)
  235.     rts
  236.  
  237. np_music    moveq    #0,d6
  238.     lea    ($dff0d0),a4
  239.     lea    (np_block,pc),a6
  240.     subq.b    #1,(a6)
  241.     bhi    np_nonew
  242.     lea    (np_position,pc),a3
  243.     movea.l    (a3)+,a0
  244.     adda.w    (6,a6),a0
  245.     move.w    (a0),d0
  246.     movea.l    (a3)+,a0
  247.     adda.w    d0,a0
  248.     movea.l    (a3)+,a1
  249.     adda.w    (8,a6),a1
  250.     lea    (np_voidat1,pc),a2
  251.     moveq    #8,d0
  252.     moveq    #0,d5
  253. np_loop1    moveq    #0,d1
  254.     move.w    (a0)+,d1
  255.     lea    (a1,d1.l),a3
  256.     move.b    (a3)+,d1
  257.     move.b    (a3)+,d3
  258.     move.b    (a3)+,d4
  259.     move.b    d3,d7
  260.     lsr.b    #4,d7
  261.     move.b    d1,d2
  262.     andi.w    #1,d2
  263.     beq.b    np_loop2
  264.     moveq    #$10,d2
  265. np_loop2    movea.l    (np_data),a3
  266.     suba.w    #8,a3
  267.     or.b    d7,d2
  268.     bne.b    np_loop3
  269.     move.b    (1,a2),d2
  270.     lsl.w    #4,d2
  271.     adda.w    d2,a3
  272.     bra.b    np_loop4
  273.  
  274. np_loop3    move.b    d2,(1,a2)
  275.     lsl.w    #4,d2
  276.     adda.w    d2,a3
  277.     move.w    (6,a3),(4,a2)
  278. np_loop4    andi.w    #$f,d3
  279.     move.b    d3,(2,a2)
  280.     move.b    d4,(3,a2)
  281.     andi.w    #$fe,d1
  282.     beq.b    np_loop5
  283.     move.w    (np_periods-2,pc,d1.w),d7
  284.     subq.w    #3,d3
  285.     beq    np_setport
  286.     subq.w    #2,d3
  287.     beq    np_setport
  288.     or.w    d0,d5
  289.     move.b    d1,(a2)
  290.     move.b    d6,(49,a2)
  291.     move.w    d7,(24,a2)
  292.     move.l    (a3)+,(a4)
  293.     move.w    (a3)+,(4,a4)
  294.     addq.w    #2,a3            
  295.     move.l    (a3)+,(72,a2)
  296.     move.w    (a3)+,(76,a2)
  297.     subq.w    #6,d3
  298.     bmi.b    np_loop6
  299.     add.w    d3,d3
  300.     add.w    d3,d3
  301.     movea.l    (42,a6,d3.w),a3
  302.     jmp    (a3)
  303.  
  304. np_loop5    subi.w    #11,d3
  305.     bmi.b    np_loop6
  306.     add.w    d3,d3
  307.     add.w    d3,d3
  308.     movea.l    (42,a6,d3.w),a3
  309.     jmp    (a3)
  310.  
  311. np_periods    dc.w    $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a
  312.     dc.w    $01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168,$0153,$0140
  313.     dc.w    $012e,$011d,$010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be
  314.     dc.w    $00b4,$00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  315.  
  316. np_loop6    move.w    (24,a2),(6,a4)
  317. np_loop7    move.w    (4,a2),(currentvol)
  318.     bsr    dofix
  319.     addq.w    #6,a2
  320.     suba.w    #$10,a4
  321.     lsr.w    #1,d0
  322.     bne    np_loop1
  323.     move.w    d5,($dff096)
  324.     move.b    d5,(5,a6)
  325.     move.b    (1,a6),(a6)
  326.     bsr    waitdma
  327.     move.w    (dmacon,pc),($dff096)
  328.     bsr    waitdma
  329.     movea.l    (np_position,pc),a0
  330.     bset    #0,(2,a6)
  331.     beq.b    np_break
  332.     addq.w    #3,(8,a6)
  333.     cmpi.w    #192,(8,a6)
  334.     bne.b    np_next
  335.  
  336. np_break    subq.w    #1,(patterns)        ;done 1 pattern
  337.     bsr    np_checkend
  338.     move.w    d6,(8,a6)
  339.     addq.w    #2,(6,a6)
  340.     move.w    (6,a6),d0
  341.     cmp.w    (-4,a0),d0
  342.     bne.b    np_next
  343.     move.w    (-2,a0),(6,a6)
  344. np_next    movem.l    a5-a6,-(sp)
  345.     lea    (np_voidat2,pc),a6
  346.     lea    ($dff000),a5
  347.     move.l    (a6)+,($d0,a5)
  348.     move.w    (a6)+,($d4,a5)
  349.     move.l    (a6)+,($c0,a5)
  350.     move.w    (a6)+,($c4,a5)
  351.     move.l    (a6)+,($b0,a5)
  352.     move.w    (a6)+,($b4,a5)
  353.     move.l    (a6)+,($a0,a5)
  354.     move.w    (a6)+,($a4,a5)
  355.     movem.l    (sp)+,a5-a6
  356.     rts
  357.  
  358. np_checkend    bpl    np_notdone        ;done patterns?
  359.     movem.l    a0/a5,-(sp)        ;yes!
  360.     move.l    (DTbase),a5
  361.     movea.l    (dtg_SongEnd,a5),a0
  362.     jsr    (a0)                ;inform DT
  363.     movem.l    (sp)+,a0/a5
  364. np_notdone    rts
  365.  
  366. np_setvol    move.b    d4,(5,a2)
  367.     bra    np_loop6
  368.  
  369. np_pattbreak    move.w    d6,(2,a6)
  370.     bra    np_loop6
  371.  
  372. np_songjmp    move.w    d6,(2,a6)
  373.     move.b    d4,(7,a6)
  374.     bra    np_loop6
  375.  
  376. np_setspeed    move.b    d4,(1,a6)
  377.     bra    np_loop6
  378.  
  379. np_filter
  380. *    andi.b    #$fd,($bfe001)
  381. *    or.b    d4,($bfe001)
  382.     bra    np_loop6
  383.  
  384. np_setport    move.b    d6,(50,a2)
  385.     move.w    d7,(26,a2)
  386.     cmp.w    (24,a2),d7
  387.     beq.b    np_clrport
  388.     bge    np_loop7
  389.     move.b    #1,(50,a2)
  390.     bra    np_loop7
  391.  
  392. np_clrport    move.w    d6,(26,a2)
  393.     bra    np_loop7
  394.  
  395. np_nonew    lea    (np_voidat1,pc),a0
  396.     moveq    #3,d0
  397. np_lop1    moveq    #0,d1
  398.     move.b    (2,a0),d1
  399.     beq.b    np_lop2
  400.     subq.w    #8,d1
  401.     bhi.b    np_lop2
  402.     addq.w    #7,d1
  403.     add.w    d1,d1
  404.     add.w    d1,d1
  405.     movea.l    (10,a6,d1.w),a3
  406.     jmp    (a3)
  407.  
  408. np_lop2    addq.w    #6,a0
  409.     suba.w    #$10,a4
  410.     dbra    d0,np_lop1
  411.     rts
  412.  
  413. np_portup    moveq    #0,d2
  414.     move.b    (3,a0),d2
  415.     sub.w    d2,(24,a0)
  416.     cmpi.w    #$71,(24,a0)
  417.     bpl.b    np_portup2
  418.     move.w    #$71,(24,a0)
  419. np_portup2    move.w    (24,a0),(6,a4)
  420.     bra.b    np_lop2
  421.  
  422. np_portdown    moveq    #0,d2
  423.     move.b    (3,a0),d2
  424.     add.w    d2,(24,a0)
  425.     cmpi.w    #$358,(24,a0)
  426.     bmi.b    np_portdown2
  427.     move.w    #$358,(24,a0)
  428. np_portdown2    move.w    (24,a0),(6,a4)
  429.     bra.b    np_lop2
  430.  
  431. np_arp    moveq    #0,d2
  432.     move.b    (a6),d2
  433.     sub.b    (1,a6),d2
  434.     neg.b    d2
  435.     move.b    (np_arplist,pc,d2.w),d2
  436.     beq.b    np_arp0
  437.     subq.b    #2,d2
  438.     beq.b    np_arp2
  439.  
  440. np_arp1    move.b    (3,a0),d2
  441.     lsr.w    #3,d2
  442.     andi.w    #$e,d2
  443.     bra.b    np_arp3
  444.  
  445. np_arp2    move.b    (3,a0),d2
  446.     andi.w    #$f,d2
  447.     add.w    d2,d2
  448. np_arp3    add.b    (a0),d2
  449.     cmpi.w    #$48,d2
  450.     bls.b    np_arp4
  451.     moveq    #$48,d2
  452. np_arp4    lea    (np_periods-2,pc),a3
  453.     move.w    (a3,d2.w),(6,a4)
  454.     bra    np_lop2
  455.  
  456. np_arp0    move.w    (24,a0),(6,a4)
  457.     bra    np_lop2
  458.  
  459. np_arplist    dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1
  460. np_sin    dc.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  461.     dc.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  462.  
  463. np_vib    move.b    (3,a0),d3
  464.     beq.b    np_vib2
  465.     move.b    d3,(48,a0)
  466. np_vib2    move.b    (49,a0),d3
  467.     lsr.b    #2,d3
  468.     andi.w    #$1f,d3
  469.     moveq    #0,d2
  470.     move.b    (np_sin,pc,d3.w),d2
  471.     move.b    (48,a0),d3
  472.     andi.w    #$f,d3
  473.     mulu.w    d3,d2
  474.     lsr.w    #7,d2
  475.     move.w    (24,a0),d3
  476.     tst.b    (49,a0)
  477.     bmi.b    np_vibsub
  478.     add.w    d2,d3
  479.     bra.b    np_vib3
  480.  
  481. np_vibsub    sub.w    d2,d3
  482. np_vib3    move.w    d3,(6,a4)
  483.     move.b    (48,a0),d3
  484.     lsr.b    #2,d3
  485.     andi.w    #$3c,d3
  486.     add.b    d3,(49,a0)
  487.     cmpi.b    #20,d1
  488.     bne    np_lop2
  489.  
  490. np_volslide    move.b    (3,a0),d2
  491.     add.b    d2,(5,a0)
  492.     bmi.b    np_vol3
  493.     cmpi.b    #$40,(5,a0)
  494.     bmi.b    np_vol2
  495.     move.w    #$40,(4,a0)
  496. np_vol2    move.w    (4,a0),(currentvol)
  497.     bsr    dofix
  498.     bra    np_lop2
  499.  
  500. np_vol3    move.w    d6,(4,a0)
  501.     move.w    d6,(currentvol)
  502.     bsr    dofix
  503.     bra    np_lop2
  504.  
  505. np_port    move.b    (3,a0),d2
  506.     beq.b    np_port2
  507.     move.b    d2,(29,a0)
  508. np_port2    move.w    (26,a0),d2
  509.     beq.b    np_rts
  510.     move.w    (28,a0),d3
  511.     tst.b    (50,a0)
  512.     bne.b    np_sub
  513.     add.w    d3,(24,a0)
  514.     cmp.w    (24,a0),d2
  515.     bgt.b    np_portok
  516.     move.w    d2,(24,a0)
  517.     move.w    d6,(26,a0)
  518. np_portok    move.w    (24,a0),(6,a4)
  519. np_rts    cmpi.b    #16,d1
  520.     beq.b    np_volslide
  521.     bra    np_lop2
  522.  
  523. np_sub    sub.w    d3,(24,a0)
  524.     cmp.w    (24,a0),d2
  525.     blt.b    np_portok
  526.     move.w    d2,(24,a0)
  527.     move.w    d6,(26,a0)
  528.     move.w    (24,a0),(6,a4)
  529.     cmpi.b    #16,d1
  530.     beq    np_volslide
  531.     bra    np_lop2
  532.  
  533. waitdma    movem.l    d0-d1,-(sp)
  534.     moveq    #7,d0            ;adjust as needed
  535. dlp1    move.b    ($dff006),d1
  536. dlp2    cmp.b    ($dff006),d1
  537.     beq    dlp2
  538.     dbra    d0,dlp1
  539.     movem.l    (sp)+,d0-d1
  540.     rts    
  541.  
  542. dofix    movem.l    d1,-(sp)
  543.     move.l    a4,d1
  544.     cmpi.b    #$d8,d1
  545.     beq    fixleft
  546.     cmpi.b    #$d0,d1
  547.     beq    fixleft
  548.     cmpi.b    #$c8,d1
  549.     beq    fixright
  550.     cmpi.b    #$c0,d1
  551.     beq    fixright
  552.     cmpi.b    #$b8,d1
  553.     beq    fixright
  554.     cmpi.b    #$b0,d1
  555.     beq    fixright
  556.  
  557. fixleft    movem.l    d0,-(sp)
  558.     moveq    #0,d0
  559.     move.w    (currentvol),d0
  560.     mulu.w    (lv),d0
  561.     bra    divide
  562.  
  563. fixright    movem.l    d0,-(sp)
  564.     moveq    #0,d0
  565.     move.w    (currentvol),d0
  566.     mulu.w    (rv),d0
  567. divide    mulu.w    (mv),d0    
  568.     lsl.l    #4,d0
  569.     swap.w    d0
  570.     btst.l    #3,d1
  571.     bne    fixsave
  572.     move.w    d0,(8,a4)
  573.     bra    getout
  574. fixsave    move.w    d0,(a4)
  575. getout    movem.l    (sp)+,d0
  576.     movem.l    (sp)+,d1
  577.     rts
  578.  
  579. np_position    dcb.l    3,0
  580. np_oldirq    dc.l    0
  581. np_block    dc.l    0
  582. dmacon    dc.w    0
  583.     dcb.l    14,0
  584. np_voidat1    dcb.l    18,0
  585. np_voidat2    dc.l    0
  586.     dc.w    0
  587.     dc.l    0
  588.     dc.w    0
  589.     dc.l    0
  590.     dc.w    0
  591.     dc.l    0
  592.     dc.w    0
  593.     dc.l    0                ;safety buffer
  594.     END
  595.  
  596.